#include <iostream>

using namespace std;

//运算符重载概念:对已有的运算符重新进行定义，赋予其另一种功能，以适应不同的数据类型
//运算符重载也可以发生函数重载
//注意事项
//1、对于内置的数据类型的表达式的运算符是不能改变的
//2、不要滥用运算符重载

//加号运算符重载作用:实现两个自定义数据类型相加的运算
class Person {
public:
    int a;
    int b;
    //1、通过成员函数重载加号
    //重载的本质调用Person p3=p1.operator+(p2);
//    Person operator+(Person &person) {
//        Person p;
//        p.a= this->a+person.a;
//        p.b= this->a+person.b;
//        return p;
//    }
};

//2、通过全局函数重载+号
//重载的本质调用Person p3=operator+(p1,p2);
Person operator+(Person &p1, Person &p2) {
    Person person;
    person.a = p1.a + p2.a;
    person.b = p1.b + p2.b;
    return person;
}

//3、函数重载的版本
Person operator+(Person &p, int a) {
    Person temp;
    temp.a = p.a + a;
    temp.b = p.b + a;
    return temp;
}

void test1() {
    Person person1;
    person1.a = 10;
    person1.b = 10;
    Person person2;
    person2.a = 20;
    person2.b = 20;
    Person person3 = person1 + person2;
    cout << "person:a=" << person3.a << ",b=" << person3.b << endl;
    Person person4 = person3 + 10;
    cout << "p4:a=" << person4.a << ",b=" << person4.b << endl;
}

int main() {
    test1();
    return 0;
}